//
// @Auther: by wujehy 
// @Email:wujehy@qq.com
// @Data:20-1-15
// @Time:上午11:02
//

#ifndef UNTITLED_FILECONFIG_H
#define UNTITLED_FILECONFIG_H

#include <iostream>
#include <rapidjson/document.h>

/**
 * @brief 使用方式 实例化直接 对json 操作, json 的路径  通过 path 的方式 获取
 *
 * 例如:
 * {
 *   "root": {
 *       "key": "dadas1da",
 *       "key2": "dadas2"
 *   }
 * }
 *
 * 的 key 的 path(路径) 是 "/root/key"
 *
 */
class FileConfig {
private:
    rapidjson::Document document;
    std::string currentConfigPath;
public:
    ~FileConfig(); // 析钩
    FileConfig(std::string configPath = "");

    /**
     * @brief 更改配置文件
     * @param configPath 新的配置文件路径 ,为空则填入默认地址
     * @param saveOldConfig 是否将旧的 配置文件保存到本地 true 则先保存在 切换 ,false 则 忽略保存直接 切换
     * @return
     */
    int changePath(std::string configPath, bool saveFile = true);

    /**
     * @brief 读取配置我的数值
     * @param path json 的 键值
     * @param value json 键的读取 内容
     * @return 0 是成功 ,1 是失败
     */
    int Read(std::string path, std::string &value);

    /**
     * 将读取的类型用 int32_t 读取
     * @param path
     * @param value
     * @return
     */
    int Read(std::string path, int32_t &value);

    /**
     * 将读取的类型用 uint32_t 读取
     * @param path
     * @param value
     * @return
     */
    int Read(std::string path, uint32_t &value);

    /**
     * 将读取的类型用 int64_t 读取
     * @param path
     * @param value
     * @return
     */
    int Read(std::string path, int64_t &value);

    /**
     * 将读取的类型用 uint64_t 读取
     * @param path
     * @param value
     * @return
     */
    int Read(std::string path, uint64_t &value);

    /**
     * 将读取的类型用 float 读取
     * @param path
     * @param value
     * @return
     */
    int Read(std::string path, float &value);

    /**
     * 将读取的类型用 double 读取
     * @param path
     * @param value
     * @return
     */
    int Read(std::string path, double &value);

    /**
     * @brief 将需要写入的值 存进配置文件
     * @param path json 的 键值
     * @param value json 键的 需要写入的内容
     * @param saveFile 是否保存到本地 ,如果 是 false 则 只缓存到 内存中,直到下次 Write 的时候 才 写入
     * @return 0 是成功 ,1 是失败
     */
    int Write(std::string path, std::string value, bool saveFile = false);

    /**
     * 写入 整形 数据 32 有符号
     * @param path
     * @param value
     * @param saveFile
     * @return
     */
    int Write(std::string path, int64_t value, bool saveFile = false);

    /**
     * 写入 整形 数据 无符号
     * @param path
     * @param value
     * @param saveFile
     * @return
     */
    int WriteUInt64(std::string path, uint64_t value, bool saveFile = false);

    /**
     * 写入 浮点 双精度
     * @param path
     * @param value
     * @param saveFile
     * @return
     */
    int WriteDouble(std::string path, double value, bool saveFile = false);

    /**
     * @brief 将内存中的数据保存到 配置文件
     */
    void saveDataInLocal();
};


#endif //UNTITLED_FILECONFIG_H
